package com.kfm.pm;

import java.util.HashMap;
import java.util.function.BiFunction;
import java.util.function.Function;

public class ComputeDemo {

    public static void main(String[] args) {
        HashMap<Integer, TVPlay> hashMap = new HashMap<>();
        hashMap.put(1, new TVPlay("甄嬛传", 74));
        hashMap.put(2, new TVPlay("长风渡", 40));
        hashMap.put(3, new TVPlay("莲花楼", 40));
        hashMap.put(4, new TVPlay("长相思", 40));
        hashMap.put(5, new TVPlay("长相思", 40));
        System.out.println(hashMap.containsKey(5)); // true
        // compute 无论key是否存在 都会进入apply方法
            // key 存在 apply方法返回的是null key就会被删除 方法返回非null值，会把返回值和key映射起来 hashMap.put(key, hj)
            // key 不存在 apply方法返回的是非null值 会把返回值和key映射起来添加到HashMap中
            // hashMap.put(key, value)
        TVPlay compute = hashMap.compute(6, new BiFunction<Integer, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(Integer key, TVPlay value) {
                System.out.println("key" + key);
                System.out.println("value" + value);
//                TVPlay hj = new TVPlay("回家的诱惑", 80);
                return null;
            }
        });
        System.out.println(compute); // null
        System.out.println(hashMap.containsKey(6)); // false
        System.out.println(hashMap.get(6)); // null
        System.out.println(hashMap);

        HashMap<Character, Integer> hashMap1 = new HashMap<>();
        // aabbccddeeaa
        // a==4 b ==2 c ==2 d == 3 e ==2
        String str = "aabbccddeeaa";
        for (int i = 0; i < str.length(); i ++) {
            char c = str.charAt(i);
            hashMap1.compute(c, new BiFunction<Character, Integer, Integer>() {
                @Override
                public Integer apply(Character character, Integer value) {
                    // 第一次进入 value == null 第二次进入 编程 value + 1
                    return value == null ? 1 : value + 1;
                }
            });
        }
        System.out.println(hashMap1);
        // key 不存在 或者映射的是null  containsKey 返回true get(key) null
        // apply方法返回的是非null值 会把返回值和key映射起来添加到HashMap中
        TVPlay tvPlay = hashMap.computeIfAbsent(7, new Function<Integer, TVPlay>() {
            @Override
            public TVPlay apply(Integer key) {
                System.out.println(key);
                return new TVPlay("长月烬明", 40);
            }
        });
        System.out.println(tvPlay); // 长月烬明
        System.out.println(hashMap.containsKey(7)); // true
        System.out.println(hashMap.get(7)); // 长月烬明
//        System.out.println(hashMap);
        // 当key存在 containsKey true  get(key) != null
        // 当apply方法返回null值，删除key的映射 remove(key)
        // 当apply方法返回非null值，把返回值和key映射起来  put(key, 返回值);
        TVPlay t = hashMap.computeIfPresent(7, new BiFunction<Integer, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(Integer integer, TVPlay tvPlay) {
                System.out.println(integer);
                System.out.println(tvPlay);
                return new TVPlay("仙剑奇侠传", 37);
            }
        });
        System.out.println(t); // 仙剑
        System.out.println(hashMap.containsKey(7)); // true
        System.out.println(hashMap.get(7)); // 仙剑

        // 如果key没有映射的值或者为null，那么就把 key和value映射起来添加到hashMap中 并返回value
        // 如果key有映射，apply方法返回null删除掉key remove(key)
                        // apply方法返回非null，将key和返回值映射  put(key, 返回值)
        TVPlay t1 = hashMap.merge(7, new TVPlay("庆余年", 56), new BiFunction<TVPlay, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(TVPlay tvPlay, TVPlay tvPlay2) {
                System.out.println(tvPlay); // 仙剑
                System.out.println(tvPlay2); // 庆余年
                return tvPlay2;
            }
        });
        System.out.println(t1); // 庆余年
        System.out.println(hashMap.containsKey(7));
        System.out.println(hashMap.get(7));
    }
}
